<!DOCTYPE html>
<html lang="en">
<head><link rel="icon" type="image/png" href="favicon-checkerframework.png">
  <title>The Checker Framework</title>
  <meta charset="utf-8">
</head>
<body>

<img src="CFLogo.png" alt="Checker Framework logo" />

<h1>The Checker Framework</h1>

<p>
Are you tired of null pointer exceptions, unintended side effects, SQL
injections, concurrency errors, mistaken equality tests, and other run-time
errors that appear during testing or in the field?
</p>

<p>
The Checker Framework enhances Java's type system to make it more powerful
and useful. This lets software developers detect and prevent errors in
their Java programs.  The Checker Framework includes compiler plug-ins
("checkers") that find bugs or verify their absence.  It also permits you
to write your own compiler plug-ins.
</p>

<ul>
  <li>
    Quick start:  see the
    <a href="manual/#installation"><b>Installation instructions and tutorial</b></a>.
  </li>
  <li>
    Download: <a href="checker-framework-3.52.1.zip"><!-- checker-framework-zip-version -->checker-framework-3.52.1.zip<!-- /checker-framework-zip-version --></a>
    (<!-- checker-framework-date -->2025-12-02<!-- /checker-framework-date -->);
    includes source, platform-independent binary, tests, and documentation.<br/>
    Then, see the <a
    href="manual/#installation"><b>installation
    instructions and tutorial</b></a>.
  </li>

  <li>
    Documentation:
    <!-- Keep this in sync with the list below. -->
    <ul>
      <li>
        <a href="manual/">Checker Framework Manual (HTML)</a>
      </li>
      <li>
        <a href="manual/checker-framework-manual.pdf">Checker Framework Manual (PDF)</a>
      </li>
      <li>
        <a href="manual/#installation">Installation instructions</a><br/>
        or, try it without installation at the
        <a href="http://eisop.uwaterloo.ca/live/">Checker Framework Live Demo</a>
        webpage
      </li>
      <li>
        <a href="tutorial/">Tutorial</a> with Nullness Checker, Regex Checker, and Tainting checker<br/>
        (There is also an older external <a href="https://github.com/glts/safer-spring-petclinic/wiki">Nullness Checker tutorial</a> whose setup information is out of date.)
      </li>
      <li>
        <a href="manual/#faq">FAQ (Frequently Asked Questions with answers)</a>
      </li>
      <li>
        <a href="api/">Javadoc</a> API documentation
      </li>
      <li>
        <a href="CHANGELOG.md">Changelog</a>
      </li>
    </ul>
  </li>

  <li>
    Source code repository (at GitHub):  <a href="https://github.com/typetools/checker-framework/">https://github.com/typetools/checker-framework/</a><br/>
    The Checker Framework Manual contains <a href="manual/#build-source">instructions on building from source</a>.<br/>
    Also see the <a href="https://htmlpreview.github.io/?https://github.com/typetools/checker-framework/master/docs/developer/developer-manual.html">Developer manual</a>.
  </li>

  <!-- This paragraph appears identically at jsr308-langtools/doc/openjdk-webpage.html -->
  <li>
    Inference tools automatically add annotations to your code,
    making it even easier to start using the checkers.  The Checker Framework manual contains <a
href="manual/#type-inference-tools">a list of inference tools</a>.
  </li>

  <li>Optional related tools:
    <ul>
      <li>The <a href="annotation-file-utilities/"><b>Annotation File Utilities</b></a>
          extract annotations from, and write annotations to,
          <code>.java</code> and <code>.class</code> files.
          It also provides a representation (called
          an &ldquo;annotation file&rdquo;) for annotations that is outside the source code or
          the <code>.class</code> file.  The tools support both Java 5
          declaration annotations and Java 8 type annotations.
        <ul>
          <li> It is distributed with the Checker Framework.
          </li>
          <li><a href="annotation-file-utilities/">Documentation</a>
              is included in the zip archive and in the repository.
          </li>
        </ul>
      </li>
      <li>The <a href="https://checkerframework.org/manual/checker-framework-dataflow-manual.pdf"><b>Dataflow
        Framework</b></a> is an industrial-strength dataflow framework for
        Java.  The Dataflow Framework is used in the Checker Framework, Google’s
        Error Prone, Uber’s NullAway, Meta’s Nullsafe, and in other contexts.
        It is distributed with the Checker Framework.
      </li>
    </ul>
  </li>

  <li>
    <a href="releases/">Archive of previous releases</a> of the Checker Framework
  </li>

  <li>
    Research papers:  See the <a
href="manual/#publications">Checker Framework manual</a>
  </li>

</ul>



<hr />
<h2 id="Support">Support and community</h2>

<p>
If you <b>have a question</b>, then first see whether your question is
answered in one of the manuals listed under
<a href="#documentation">Documentation</a> below.
If none of those documents answers your question, then use one of the
<a href="#mailing-lists">mailing lists</a>.
</p>


<h3 id="documentation">Documentation</h3>

    <!-- Keep this in sync with the list above. -->
    <ul>
      <li>
        Checker Framework Manual (<a href="manual/checker-framework-manual.pdf">PDF</a>, <a href="manual/">HTML</a>)
      </li>
      <li>
        <a href="manual/#installation">Installation instructions</a>
      <br/>
        or, try it without installation at the
        <a href="http://eisop.uwaterloo.ca/live/">Checker Framework Live Demo</a>
        webpage
      </li>
      <li>
        <a href="tutorial/">Tutorial</a>
        Other tutorials:<ul>
          <li>
            <a href="https://github.com/glts/safer-spring-petclinic/wiki">Nullness Checker tutorial</a>
            (external site, setup information is out of date)
          </li>
        </ul>
      </li>
      <li>
        <a href="manual/#faq">FAQ (Frequently Asked Questions with answers)</a>
      </li>
      <li>
        <a href="api/">Javadoc</a> API documentation
      </li>
      <li>
        <a href="CHANGELOG.md">Changelog</a>
      </li>
    </ul>


<h3 id="bugs">Bug reports</h3>

<p>
If you encounter a problem, please submit a bug report so that we can fix it.
To submit a bug report, read these
<a href="manual/#reporting-bugs">instructions</a>, and then use the <a href="https://github.com/typetools/checker-framework/issues">Checker Framework issue tracker</a>.
</p>


<h3 id="mailing-lists">Mailing lists</h3>

<p>
We welcome questions, suggestions, patches, reports about case
studies,
and other contributions.
Please let us know how we can improve the Checker Framework!
</p>

<ul>
  <li>
    <a href="https://groups.google.com/forum/#!forum/checker-framework-discuss">checker-framework-discuss</a>:
    for general discussion about the Checker Framework for building
    pluggable type systems
    (<a href="https://groups.google.com/forum/#!forum/checker-framework-discuss/topics">view archives</a>,
    <a href="https://types.cs.washington.edu/list-archives/jsr308/">view old archives</a>)
  </li>
  <li>
    <a href="https://groups.google.com/forum/#!forum/checker-framework-dev">checker-framework-dev</a>:
    to reach the developers who maintain and extend the Checker Framework
    (<a href="https://groups.google.com/forum/#!forum/checker-framework-dev/topics">view archives</a>,
    <a href="https://types.cs.washington.edu/list-archives/checkers/">view old archives</a>)
  </li>
</ul>

<p>
You can also use the mailing lists to <b>give help</b>.  Here are just a
few examples:
</p>
<ul>
  <li>Respond to questions.</li>
  <li>Report problems (in the implementation or the documentation) or request features.</li>
  <li>Write code, then share your bug fixes, new features, compiler plug-ins,
      or other improvements.</li>
  <li>Make suggestions regarding the specification.</li>
</ul>


<p>
Another way to help is to tell your friends and colleagues about the
usefulness and practicality of type annotations, or to report your
successes to the mailing lists.
</p>



<hr />

<p>
Last updated: <!-- checker-framework-date -->2025-12-02<!-- /checker-framework-date -->
</p>

</body>
</html>
<!--
IGNORE Local Variables:
time-stamp-start: "^Last updated: "
time-stamp-end: "\\.?$"
time-stamp-format: "%:b %:d, %:y"
time-stamp-line-limit: -50
End:
-->

<!--  LocalWords:  JCP wiki classfile OpenJDK javac var NonNull subcategory SCA Sep JastAdd Regex ReIm ReImInfer JavaUI
 -->
<!--  LocalWords:  classfiles const changelog JLS Metadata getSize sql BNF jsr
 -->
<!--  LocalWords:  openjdk Inv isible isibleTypeAnnotations TypeArguments
 -->
<!--  LocalWords:  VariableDeclaratorRest MethodOrFieldRest TypeArgument Alast
 -->
<!--  LocalWords:  TypeArgumentsAnnotationsLast TypeArgumentsAnnotationsFirst
 -->
<!--  LocalWords:  BasicType RawBasicType NonEmpty Afirst UnmodifiableList int
 -->
<!--  LocalWords:  monitorTemperature TemperatureException myString myObject EE
 -->
<!--  LocalWords:  isNonNull instanceof myNonEmptyStringSet MyObject langtools
 -->
<!--  LocalWords:  rc desugar txt dev Nullable codename
 -->
